package reflect

import (
	"fmt"
	"reflect"
)

func test1() {
	i := 10
	t := reflect.TypeOf(i)  //得到类型的元数据,通过t我们能获取类型定义里面的所有元素
	v := reflect.ValueOf(i) //得到实际的值，通过v我们获取存储在里面的值，还可以去改变值
	fmt.Println(t)
	fmt.Println(v)
}

func test2() {
	var x float64 = 3.4
	v := reflect.ValueOf(x)
	fmt.Println("type:", v.Type())
	fmt.Println("kind is float64:", v.Kind() == reflect.Float64)
	fmt.Println("value:", v.Float())
}

type Class struct {
	name string
	num  int
}

func test3() {
	class := Class{"name", 22}
	classType := reflect.TypeOf(&class) //对象类型需要进行引用传递
	classValue := reflect.ValueOf(&class)
	fmt.Println(classType)
	fmt.Println(classValue)
	fmt.Println(classValue.Elem().Type())
	tag := classType.Elem().Field(0).Tag        //获取定义在struct里面的标签
	name := classValue.Elem().Field(0).String() //获取存储在第一个字段里面的值
	fmt.Println(tag)
	fmt.Println(name)
}

func test4() {
	var x float64 = 3.4
	p := reflect.ValueOf(&x) //修改值必须要传地址
	v := p.Elem()
	v.SetFloat(7.1)
}

func TestReflect() {
	test1()
	test2()
	test3()
}
